package dataMining.apriori3;

/**
 * @author cuih
 * Date: 13-5-21
 */

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class Find_frequent_2 {
    Find_frequent_1 freq_1 = new Find_frequent_1();
    boolean[][] DATA = freq_1.DATA;   //全局数据表，用于数据的
    int max = 0;//用于记录频繁项集的个数
    int length = 0;//记录项集的位置 ，最多为K
    ArrayList[] frequent_item_list = new ArrayList[1000000];
    ArrayList[] candidateList = new ArrayList[1000000]; //存放候选项集
    int[] sup = new int[10000];//为每个项集定义一个支持度
    int count = 0;              //计算项集的总个数

    void find_frequent(int[] L1, int K) throws IOException {
        //生成候选项集,直接操作
        for (int i = 0; i < 120; i++) {
            if (L1[i] != 0) {
                for (int j = i + 1; j < 120; j++) {
                    if (L1[j] != 0) { //只要是频繁项就进行连接
                        if (length == 0) {                  //第一个数后近此位置
                            candidateList[max] = new ArrayList(K);
                            candidateList[max].add(i);
                            candidateList[max].add(j);       //赋值
                            scanDB(i, j, max);                 //此时数据输入结束，扫面sup
                            length = 1;
                            max++;
                        } else {                   //length为 1 ,第二个数所进的位置
                            candidateList[max] = new ArrayList(K);//arrayList初始化
                            candidateList[max].add(i);    //将之前的进行赋值 ，重复之前的操作
                            candidateList[max].add(j);        //一次对后面的进行赋值
                            scanDB(i, j, max);
                            length = 1;
                            max++;
                        }
                    }
                }
            }
        }  //生成候选项集结束

        //对频繁2项集的文件进行输出
        File outDataFile = new File(AprioriFrequentItemset.outputFile);// 定义输出文件
        FileWriter ps = new FileWriter(outDataFile, true);
        ps.write("频繁2项集包括：\r\n");
        for (int i = 0; i <= max; i++) {
            if (sup[i] >= AprioriFrequentItemset.sup_absolute) { //支持度大于所需要的支持度
                frequent_item_list[count] = new ArrayList(K);      //存放频繁项集的arrayList，并且进行初始化
                for (int j = 0; j < K; j++) {
                    Object item = candidateList[i].get(j);
                    ps.write(item + " ");  //将该数进行输出
                    frequent_item_list[count].add(item);
                }
                ps.write(":" + sup[i] + "\r\n");    //写入数据
                frequent_item_list[count].add(sup[i]);      //最后一位写入频繁度
                count++;                               //总的记录频繁项集的数目
            }
        }
        ps.write("频繁2项集总计" + count + "个\r\n");
        ps.close();

        //调用对频繁K项集的操作
        if (AprioriFrequentItemset.K > K) {                             //此时K=2，直接向下一层进行调用
            Find_frequent_n find_frequent_n = new Find_frequent_n();
            find_frequent_n.find_frequent(frequent_item_list, K + 1);    //调用下一层
        }
    }

    //扫描数据库，对两个项集分别进行检验计数，得到其最终的支持度
    void scanDB(int number1, int number2, int max) {
        sup[max] = 0;                                   //支持度初始化为0
        for (int i = 0; i < 8024; i++) {
            if (DATA[i][number1] && DATA[i][number2]) {
                sup[max]++;  //累计支持度
            }
        }
    }
}
